#ifndef RANGE_ACCESS_H_
#define RANGE_ACCESS_H_
/* 返回一个容器的第一和最后一个元素的迭代器
 * 全局函数, 作用和各容器的成员函数begin(), end()相同,
 * */

// initializer_list内有自己特化的begin()和end()
// 因为initializer_list内部的构造函数定义在private域中, 且编译器可以内部调用.
// initializer_list内部保存const元素
#include<initializer_list>
#include<cstddef>
namespace spwstd {
//普通容器
template<typename Container>
inline auto 
begin(Container& con) -> decltype(con.begin())
{
    return con.begin();
}


template<typename Container>
inline auto 
begin(const Container& con) -> decltype(con.begin())
{
    return con.begin();
}

template<typename Container>
inline auto 
end(Container& con) -> decltype(con.end())
{
    return con.end();
}

template<typename Container>
inline auto 
end(const Container& con) -> decltype(con.end())
{
    return con.end();
}

//数组
template<typename Value_Type, size_t Nm>
inline Value_Type* 
begin(Value_Type (&arr)[Nm]) {
    return arr;
}
template<typename Value_Type, size_t Nm>
inline Value_Type* 
end(Value_Type (&arr)[Nm]) {
    return arr + Nm;
}
} // namespace spwstd
#endif

